/*
打开test.txt文件，并将内存映射到该文件长度大小相同空间，
设置共享内存内容同步到磁盘对应文件，
然后向该内存映射区写入了字符串，最后释放内存映射区
*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>

int main(int argc, const char *argv[])
{
    int fd = open("test.txt", O_RDWR);
    if (fd == -1)
    {
        perror("open error");
        exit(1);
    }
    // get file length
    int len = lseek(fd, 0, SEEK_END);
    // mmap()：创建内存映射; 作用：将磁盘文件的数据映射到内存，用户通过修改内存就能修改磁盘文件
    void *ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    // ptr 指向映射区的首地址
    if (ptr == MAP_FAILED)
    {
        perror("mmap error");
        exit(1);
    }
    close(fd);

    char buf[4096];
    // 从内存中读数据
    printf("buf = %s\n", buf);
    strcpy(ptr, "yyyyyyyyyyyyyyyy");
    printf("ptr = %s\n", (char *)ptr);

    // munmap(): 释放内存映射区
    int ret = munmap(ptr, len);
    if (ret == -1)
    {
        perror("munmap error");
        exit(1);
    }
    return 0;
}